package br.ucb.cesbdao.model.impl;

import java.sql.SQLException;
import java.util.ArrayList;

import lombok.Getter;
import lombok.Setter;

import org.apache.log4j.Logger;

import br.ucb.cesbdao.beans.Grupo;
import br.ucb.cesbdao.enuns.EnumMensagens;
import br.ucb.cesbdao.model.GrupoModel;
import br.ucb.cesbdao.persistencia.dao.GrupoDAO;
import br.ucb.cesbdao.persistencia.factory.FactoryConnection;
import br.ucb.cesbdao.persistencia.factory.FactoryDAO;
import br.ucb.cesbdao.servicos.Servicos;
import br.ucb.cesbdao.visao.Visao;

public class GrupoModelImpl implements GrupoModel{
	
	private Logger logger = Servicos.carregaLog(GrupoModelImpl.class);
	@Getter @Setter
	private GrupoDAO dao;

	public GrupoModelImpl() {
	}

	@Override
	public int addGrupo(Grupo grupo) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().addGrupo(grupo);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return 0;
	}

	@Override
	public ArrayList<Grupo> consultaGrupoNome(String nome) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaGrupoNome(nome);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Grupo> consultaGrupoDia(int dia) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaGrupoDia(dia);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public int alteraGrupoStatus(Grupo grupo, int id) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().alteraGrupoStatus(grupo, id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return 0;
	}

	@Override
	public ArrayList<Grupo> consultaGrupoDiretoria(String diretoria) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaGrupoDiretoria(diretoria);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public Grupo consultaGrupoID(Integer id) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaGrupoID(id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Grupo> consultaGrupo() {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaGrupo();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Grupo> consultaGrupoByStatus() {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaGrupoByStatus();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public boolean excluiGrupo(Grupo grupo) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().excluiGrupo(grupo);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return false;
	}

	@Override
	public int alteraGrupo(char status, int id) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().alteraGrupo(status, id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return 0;
	}

	@Override
	public boolean alteraGrupo(Grupo grupo, int id) {
		try{
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			return getDao().alteraGrupo(grupo, id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return false;
	}
	
	@Override
	public void inativaGrupo(Integer id){      
		try {
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			Grupo grupo = getDao().consultaGrupoID(id);
			if(grupo.getStatus() != null){
				if(Visao.showYesNo(EnumMensagens.MSG_Q_CONFIRMACAO_INATIVAR_GRUPO.getMensagem(), "Atenção!")){
					grupo.setStatus('I');
					getDao().alteraGrupoStatus(grupo,id);
					return;
				}	  
			}
			grupo.setStatus('I');
			getDao().alteraGrupoStatus(grupo,id); 
			Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_EXCLUIR_SUCESSO.getMensagem(),"Atenção");
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
	}

	@Override
	public int apresentaCodigoUnicoGrupo() {
		ArrayList<Grupo> grupos = new ArrayList<Grupo>();
		try {
			setDao(FactoryDAO.getDaoGrupo(FactoryConnection.getInstance().criaConexao()));
			grupos = getDao().consultaGrupo();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		int maiorCodigo = 0;
		for (Grupo grupo : grupos) {
			if(grupo.getIdGrupo() > maiorCodigo){
				maiorCodigo = grupo.getIdGrupo();	
			}
		}
		return maiorCodigo;
	}
	
	public ArrayList<Grupo> separaGruposAtivos(ArrayList<Grupo> grupos, ArrayList<Grupo> gruposAtivos){
		for(Grupo grupo : grupos)
			if(grupo.getStatus() == 'A')
				gruposAtivos.add(grupo);
		return gruposAtivos;
	}	
}
